package com.rxmvp.baselibrary.base;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;

import com.rxmvp.baselibrary.R;


/**
 * 共性：加载状态的四个页面(加载失败页面，空数据页面，正在加载页面，加载成功页面)
 * <p>
 * Created by huangRZ on 2016/8/19.
 */
public abstract class LoadingPager extends FrameLayout {

    public static final int STATE_LOAD_UNDO= 1;  //未加载
    public static final int STATE_LOAD_LOADING = 2;//正在加载
    public static final int STATE_LOAD_ERROR = 3;//加载失败
    public static final int STATE_LOAD_EMPTY = 4;//数据为空
    public static final int STATE_LOAD_SUCCESS = 5;//加载成功

    /**
     * 这里不能设置为静态，原因：
     *  静态：不同实例公用该成员变量
     *  不是静态：不同实例之间，成员变量不共用，可以同时有不同的值
     */
    private int mCurrentState = STATE_LOAD_LOADING;

    private View mErrorPager;
    private View mLoadingPager;
    private View mEmptyPager;
    private View mSuccessPager;

    public LoadingPager(Context context) {
        super(context);
        initView();
    }

    public LoadingPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    public LoadingPager(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
    }

    //初始化不同状态下的页面
    private void initView() {
        if (mErrorPager == null) {
            mErrorPager = View.inflate(getContext(), R.layout.pager_error, null);//加载“错误”界面
            Button btn_reload = (Button) mErrorPager.findViewById(R.id.btn_reload);
            btn_reload.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    mCurrentState = STATE_LOAD_UNDO;
                    loadData();
                }
            });
            addView(mErrorPager);
        }
        if (mLoadingPager == null) {
            mLoadingPager = View.inflate(getContext(), R.layout.pager_loading, null);//加载“正在加载”界面
            addView(mLoadingPager);
        }
        if (mEmptyPager == null) {
            mEmptyPager = View.inflate(getContext(), R.layout.pager_empty, null);//加载“空数据”界面
            addView(mEmptyPager);
        }

        showPager();//展示页面
        loadData(); //首次加载页面，请求数据
    }

    //根据当前状态，展示相应的页面
    private void showPager() {
        mLoadingPager.setVisibility(mCurrentState == STATE_LOAD_LOADING || mCurrentState == STATE_LOAD_UNDO
                ? View.VISIBLE : View.GONE);//判断是否展示“正在加载”页面

        mErrorPager.setVisibility(mCurrentState == STATE_LOAD_ERROR ?
                View.VISIBLE : View.GONE );//判断是否展示“错误”页面

        mEmptyPager.setVisibility(mCurrentState == STATE_LOAD_EMPTY ?
                View.VISIBLE : View.GONE);//判断是否展示“空数据”页面

        //判断“加载成功”页面是否为空，如果不为空，并且当前为加载成功状态，就创建“加载成功”页面
        if (mCurrentState == STATE_LOAD_SUCCESS && mSuccessPager == null){
            mSuccessPager = onCreateSuccessView();
            if (mSuccessPager != null){
                addView(mSuccessPager);
            }
        }

        if (mSuccessPager != null){
            mSuccessPager.setVisibility(mCurrentState == STATE_LOAD_SUCCESS ?
                    View.VISIBLE : View.GONE);//判断是否展示“加载成功”页面
        }
    }

    /**
     * 改变当前页面的状态，并显示相应状态的页面
     * @param result
     */
    public void setState(LoadResult result){
        mCurrentState = result.getValue();
        showPager();
    }

    //加载数据，由子类实现
    protected abstract void loadData();

    //用枚举表示网络访问返回的状态
    public enum LoadResult{
        STATE_ERROR(STATE_LOAD_ERROR),STATE_EMPTY(STATE_LOAD_EMPTY),
        STATE_SUCCESS(STATE_LOAD_SUCCESS),STATE_UNDO(STATE_LOAD_UNDO);

        int result;

        LoadResult(int result){
            this.result = result;
        }

        public int getValue(){
            return result;
        }

    }

    //加载“加载成功”页面，由BaseFragment对应的子类fragment实现
    public abstract View onCreateSuccessView();

}
